\documentstyle[12pt,german,twoside,refman]{article}

% font for Dup-logo sans serif bold extended at

\catcode`\@=11
\ifnum 0=\@ptsize \newfont{\sfb}{cmssbx10 scaled 1000} % 10pt
\else 
   \ifnum 1=\@ptsize \newfont{\sfb}{cmssbx10 scaled 1095} % 11pt
   \else \newfont{\sfb}{cmssbx10 scaled 1200} % 12pt
   \fi
\fi

% logo font for the METAFONT logo at

\ifnum 0=\@ptsize \newfont{\logo}{logo10 scaled 1000} % 10pt
\else 
   \ifnum 1=\@ptsize \newfont{\logo}{logo10 scaled 1095} % 11pt
   \else \newfont{\logo}{logo10 scaled 1200} % 12pt
   \fi
\fi
\catcode`\@=12

\newcommand\Dup{{\sfb Dup}}
\newcommand\MAmiga{{\sf M2Amiga}}
\newcommand\MCED{{\sc M2undCED}}
\newcommand\METAFONT{{\logo METAFONT}}
\newcommand\VIRUSCONTROL{{\sf VIRUSCONTROL~3.0}}

\title{\Dup\hfill Version 1.0}
\author{von Thomas Ansorge}
\date{\today}

\textheight=8 true in

\pagestyle{headings}

\raggedbottom

\begin{document}

\pagenumbering{roman}

\maketitle
\makeauthor
\thispagestyle{empty}
\newpage

\vbox{\small Die in diesem Handbuch aufgeführten Waren- und Firmenbezeichnungen sind
meist eingetragene Warenzeichen und haben ein Copyright.  Sie unterliegen damit den
gesetzlichen Bestimmungen.}

\newpage

\tableofcontents
\newpage

\pagenumbering{arabic}

\section{Copyright und Haftung}

Mit dem Benutzen und/oder Bereitstellen zum Zweck des Verbreitens des 
Programms \Dup\ erklären Sie sich mit diesen Copyright- und 
Haftungsbestimmungen einverstanden. Sie hatten Gelegenheit, diese 
Copyright- und Haftungsbestimmungen vorher zu lesen!

\subsection{Copyright}

\Dup\ ist \copyright\ 1992 by Thomas Ansorge, Dinkelackerring~55,
W-6730~Neustadt-14, Deutschland. 

Jedermann darf \Dup\ benutzen und kostenlos an seine Freunde weitergeben, 
solange diese Datei in unverändertem Zustand dabei ist\footnote{Ich 
vermeide absichtlich Begriffe wie "`Public-Domain"' oder "`Freeware"', 
weil diese nicht einheitlich definiert sind!}.

\Dup\ darf auf Public-Domain Disketten unter folgenden Bedingungen verbreitet
werden:

\begin{itemize}
\item Die Diskette darf fertig bespielt nicht mehr als das doppelte 
   desjenigen Preises kosten, den die selbe Diskette in nicht formatiertem 
   Zustand im Laden kosten würde. Eine angemessene Versand-Gebühr darf bei 
   Versand extra berechnet werden.
   
   Mit "`Diskette"' ist die Hardware und nicht etwa eine bestimmte Menge an
   Software gemeint.
   
   {\footnotesize Ich kenne eine ganze Reihe von seriösen PD-Anbietern, die
   diese Bedingung bereits seit einiger Zeit vor \Dup\ von sich aus erfüllen 
   und dabei noch eine Menge Gewinn erwirtschaften. Auch wenn die meisten der
   selbsternannten "`seriösen"' PD-Anbieter letzteres konsequent leugnen.}
   
\item Bei dem Versuch, von der Diskette zu booten, darf kein Programm oder
   ein Teil eines Programms vom Boot-Block geladen und ausgeführt werden.
   
   {\footnotesize Diese Bedingung soll Anwender vor Viren schützen, da nur 
   so wirklich sichergestellt ist, daß die Diskette keinen Bootblockvirus 
   enthält. Sie hilft außerdem, daß ein im Hintrergrund laufendes
   Anti-Virenprogramm nicht ständig falschen Alarm gibt.}
   
\item Niemand erwirbt duch das Bereitstellen dieses Programms zum Zweck des 
   Verbreitens irgendwelche Rechte daran. Alle Rechte bleiben
   ausschließlich bei mir.
   
\item Das Programm darf nicht verändert und insbesondere nichts von Seiten
   Dritter hinzugefügt oder weggelassen werden.
   
\item Diese Datei ist Teil des Programms im Sinne dieser
   Copy\-right\--Be\-stim\-mung.
\end{itemize}

\Dup\ darf über Datennetze verbreitet werden, wenn die obigen Bestimmungen
für Public-Domain Disketten sinngemäß eingehalten werden.

\subsection{Haftung}

Ich benutze \Dup\ nun seit einiger Zeit und habe kein Fehlverhalten
feststellen können, weder unter Kickstart~1.3 noch unter
Kickstart~2.0. Trotzdem kann ich keine Garantie übernehmen, daß das
Programm auch bei Ihnen einwandfrei arbeitet und den beabsichtigten Zweck
erfüllt. Daher muß ich jede Haftung für eventuell durch \Dup\ entstehende 
Schäden ablehnen.

\section{Was ist \Dup ?}

Seit ich mit \TeX\ arbeite, vermisse ich etwas bei \MAmiga.  Wenn Sie bei
\TeX\ den Compiler laufenlassen, bekommen Sie 2 Ausgaben gleichzeitig:
eine in das aktuelle Fenster und eine in eine Datei, die .log-Datei.  In
dieser können Sie nachsehen, wenn die Ausgabe im Fenster längst weg ist und
noch Unklarheiten bestehen wegen dieser oder jener Sache.  \MAmiga\ macht
das nicht.  Üblicherweise haben Sie die Ausgabe von den Programmen ({\sf
M2Make}, {\sf m2c} etc.) {\em entweder\/} im Fenster {\em oder\/} in einer
Datei, aber nicht beides gleichzeitig!  Sicher, Sie können zuerst in eine
Datei schreiben und diese dann später mit type oder copy oder einem anderen
Programm ansehen -- wenn Sie sich in den meisten Fällen gar nicht mehr
dafür interessieren.  Ein Aufruf wie etwa 
$$\mbox{\tt M2Make >$\ast$>Project.log Project}$$ 
klappt nämlich leider {\em nicht\/}, weil das Dos
hier nicht mitspielt!  An dieser Stelle greift \Dup\ ein:  Es liest den
Ausgabestrom von {\sf M2Make} und gibt ihn gleichzeitig ("`on-line"', wie
der Fachmann sagt) in zwei andere Dateien aus.

\section {\Dup\ aufrufen}

\subsection{Resident}

\Dup\ ist "`pure"'! Sie können es also mit dem Resident-Befehl resident
machen.\footnote{Muß ich das sagen? Ist das nicht inzwischen Standard?}

\subsection{Argumente beim Programmstart}

\Dup\ ist ausschließlich von der Shell aus zu verwenden. Eine Verwendung
von der Workbench aus ist nicht vorgesehen.

Die Schablone beim Programmaufruf ist: 
$$\mbox{\tt$[$Run$]$ Dup \it Source Dest1 Dest2 Bufsize}$$ 
Wie Sie sehen, müssen alle Argumente angegeben werden. 

\begin{itemize}
\item Den Run-Befehl sollten Sie verwenden, da \Dup\ sich nicht von selbst 
   von der Shell löst und nach seinem Start darauf wartet, daß etwas 
   passiert.

\item Source ist die Quelle, aus der der Ausgabestrom sprudelt. Hierbei
   handelt es sich üblicherweise um das PIPE:-Gerät. Achtung! Die
   Dateinamen, die Sie angeben müssen, sind case-sensitive, d.h., Groß- und
   Kleinschreibung sind verschieden (liegt an PIPE:)!
   
\item Dest1 und Dest2 sind die beiden Zieldateien.

\item Bufsize ist die Größe des von \Dup\ verwendeten internen Puffers in
   Bytes. Ein kleiner Puffer macht die Ausgabe langsam, ein großer Puffer
   macht die Ausgabe schnell aber sprunghaft. Das Problem liegt in den
   Befehlen Dos.Write und Dos.Read begründet. Die Arbeitsgeschwindigkeit
   dieser Befehle hängt nämlich wesentlich von der verwendeten Puffergröße
   ---~Bufsize~--- ab. Ich kann da leider nicht eingreifen. Die
   Sprunghaftigkeit kommt daher, daß der Dos.Read-Befehl immer den ihm
   übergebenen Puffer füllt, bevor es weitergeht.
   
   Die Puffergröße ist minimal 1 Byte und maximal 4096 Bytes. Geben Sie
   mehr als 4096 Bytes an, so werden bei mehr als 4 Ziffern nur die ersten
   vier interpretiert, ist die Zahl aus den ersten vier Ziffern größer als
   4096, dann wird die Puffergröße auf 4096 gesetzt. 
   
   Der Grund für die 4096 Bytes ist der, daß PIPE: in der Kickstart~1.3
   Version einen eigenen Puffer von genau 4096 Bytes verwendet und ich mich
   für eine Zahl entscheiden mußte.
   
   Ich habe \Dup\ bisher nur mit PIPE: und nicht mit PIP:~(ConMan, William
   S. Hawes), FIFO:~(Matt Dillon) u. a. PIPE:-Ersatzprogrammen ausprobiert. 
   Im Prinzip müßte es aber auch damit funktionieren.
\end{itemize}

Wenn eines der Argumente Leerzeichen enthält, dann schreiben Sie bitte
dieses Argument in Hochkommas.

\subsection{Stack}

Ich kann mich nicht erinnern, daß \Dup\ bei mir einmal mehr als die
üblichen 4~kByte Stack gebraucht hätte.

\subsection{Zwei Beispiele}

Da \Dup\ nicht auf \MAmiga\ beschränkt ist, bringe ich hier zwei allgemeine
Beispiele, die nicht \MAmiga\  brauchen und wohl für alle
instruktiv sind (auch wenn sie an sich wenig Sinn machen).

Die folgende Konstruktion funktioniert üblicherweise:
\begin{eqnarray*}
&&\mbox{\tt Run Dup PIPE:A.txt CON:0/0/640/75/F1 CON:0/90/640/75/F2 10}\\
&&\mbox{\tt Dir >PIPE:A.txt SYS:}
\end{eqnarray*}

Die zweite Konstruktion funktioniert hingegen nicht, da hier zwei
verschiedene PIPE:-Dateien verwendet werden:
\begin{eqnarray*}
&&\mbox{\tt Run Dup PIPE:a.txt CON:0/0/640/75/F1 CON:0/90/640/75/F2 10}\\
&&\mbox{\tt Dir >PIPE:A.txt SYS:}
\end{eqnarray*}

Für {\tt PIPe:A.txt} und {\tt PIPE:A.txt} gilt dasselbe!

\subsection{mehr als zwei Ausgabe-Dateien}

Sie können auch mehr als zwei Ausgabedateien erzeugen. Zu diesem Zweck
führen Sie bitte die Ausgabe eines Dup-Programmes nach PIPE: zurück, wo ein
zweites (, drittes, $\dots$) Dup-Programm diese liest und seinerseits
vervielfältigt. Auch hier lohnt sich der Einsatz des Run-Befehles$\dots$

\section{Ein kurzes CLI-Tool...}

\subsection{Vorgeschichte}

Vielleicht können Sie sich an die Zeit erinnern, als \MAmiga\ {\sf 3.x}
aktuell war? Nein? Nun, damals konnte man selbstverständlich auch kurze
CLI-Tools schreiben. Aber leider nicht in Modula-2. Ein kurzes CLI-Tool
war, sollte es mehr machen als einmal "`Hello, World!"' zu schreiben und
sich dann zu verflüchtigen, nur mit großer Mühe unter 10 kByte Code zu
halten. Modula-2 war damals das Gespött aller C-Programmierer mit ihren
hochoptimierenden Compilern und Linkern. Daß trotzdem so viele Leute
Modula-2 programmierten, lag wohl an der Sprache selbst\footnote{Wer einmal
ein Programmlisting in C gesehen hat, wird mir bestätigen, daß C im
Gegensatz zu Modula keine Programmiersprache, sondern eine Programmier{\em
geheim\/}sprache ist!}. Mit \MAmiga\ {\sf 4.0} geht das angeblich nun und
ich wollte wissen, wie gut.

\subsection{Hauptteil}

Nachdem das im 1.~Kapitel beschriebene Problem (zwei Ausgaben von\linebreak
{\sf M2Make}, eine in das aktuelle Fenster, eine in eine Datei, und zwar 
gleichzeitig und on-line) bei mir auftauchte, machte ich mich daran, 
\Dup\ zu schreiben. Es wurde noch am selben Abend fertig, war um die 
8~kByte lang (immerhin!) und schaufelte Buchstaben wie ein Heizer Kohlen. 
Ich wollte es gerade in mein C:-Directory entlassen, da fiel mir die Kürze 
der anderen Befehle dort auf$\dots$

Eine schnelle Rechnung ergab, daß der durchschnittliche
Workbench~1.3-CLI-Befehl 2950\footnote{3029 Bytes bei der
Workbench~2.04}\footnote{alle Befehle im Standard-C:-Directory wurden
gezählt}\footnote{laden Sie einmal den {\tt dir}-Befehl mit dem Hex-Editor
und erklären Sie mir dann, wie {\tt dir} ohne die Dos-Library auskommt,
wenn (angeblich) keine codesparenden Direkteinsprünge ins ROM
stattfinden$\dots$} gespeicherte Bytes groß ist.  Also habe ich mir \Dup\
wieder in den Editor geholt und mir überlegt, was ich besser machen könnte.

Nach drei Tagen Arbeit (Arguments und Conversions habe ich durch eigene 
Routinen ersetzt und Compiler- und Linkeroptionen respektlos ausprobiert) 
traute ich meinen Augen nicht. Der List-Befehl bestätigte, daß mir 
\Dup\ da kein Windei in die Log-Datei gelegt hat. \Dup\ war ganze 
(gespeicherte) 1996 Bytes lang. In Worten: 
Eintausendneunhunderteinundneunzig Bytes. Und lief.

\subsection {offener Schluß}

Diese Länge hat sich dann nicht mehr wesentlich geändert; jetzt sind es
1976~Bytes plus 24~Bytes von \VIRUSCONTROL\ (siehe "`Ein paar Worte zu
Link-Viren"').

\subsection{erneutes Compilieren}

Die Optionen zum Compilieren und Linken von \Dup, die ich benutzt habe, um
\Dup\ schön kurz zu machen, entnehmen Sie bitte Anhang A.

Die Variable {\tt Sicher}, die eine bedingte Compilation bewirkt, lassen
Sie bitte auf TRUE.  Dann nämlich prüft \Dup\ beim Schreiben auf Fehler wie
etwa "`Disk Full"' und reagiert -- andernfalls riskieren Sie an dieser
Stelle einen späteren "`Disk Validating Error"' nach einer Unzahl an
Requestern oder schlimmeres!  Ob Ihnen das 60 Bytes Code wert ist, können
nur Sie selbst wissen.

Des weiteren habe ich festgestellt, daß im Fall \Dup\ das angelinkte
MRArts 132 Bytes länger ist als das nicht residentfähige MArts.
Die Fähigkeit eines Programms, resident geladen werden zu können, ist mir 
hier wichtiger.

\section{Bugs}

Bugs habe ich bisher in dieser Version nicht gefunden. Da ich statt 
Arguments und Conversions eigene Routinen geschrieben habe, die möglichst 
wenig Code erzeugen sollten, ist die Behandlung von Fehlern bei den 
Argumenten wahrscheinlich nicht so stabil wie bei Arguments selber. Ich 
habe mich bemüht, möglichst jede falsche Eingabe so oder so abzufangen -- 
garantieren kann ich aber für nichts.

Ich möchte an dieser Stelle ausdrücklich noch einmal daran erinnern, daß
\Dup\ ausschließlich von der Shell aus zu verwenden ist und ein
Workbenchstart -- genauso wie bei anderen CLI-Befehlen -- nicht abgefangen
wird.

\section{Ein paar Worte zu Link-Viren}

Sich vor Bootblockviren zu schützen ist einfach verglichen mit Linkviren,
die sich einfach an andere Programme anhängen. Da \Dup\ sehr kurz ist,
sollte ein Linkvirus schon allein durch seine Länge auf\-fallen. Da es aber
Linkviren gibt, die den Längeneintrag im Directoryblock unangetastet
lassen (so daß der Anwender {\em vorläufig} nichts davon merkt), habe ich 
\Dup\ mit \VIRUSCONTROL\ vor Linkviren geschützt. Wenn Sie ebenfalls 
\VIRUSCONTROL\ haben, können Sie nachprüfen, ob \Dup\ auf dem Weg zu Ihnen 
etwas geschehen ist. Wenn ja, wird \VIRUSCONTROL\ Sie mit 99\%iger 
Wahrscheinlichkeit (100\% Sicherheit ist bei Viren nicht möglich!) warnen.

\Dup\ ist mit dem Linkvirus-Schutz genau 2000 Bytes groß.

Beachten Sie bitte, daß \Dup\ sich nicht selbst nach Linkviren absuchen 
kann! Sie müssen schon \VIRUSCONTROL\ (oder ein kompatibles
Antivirenprogramm) bemühen!

\section{"`Credits"'}

Ich wollte das Wort "`Danksagungen"' vermeiden -- es klingt so sehr nach
"`Es war nett, daß Sie alle zu meiner Beerdigung kamen$\dots$"'

Also: Dankeschön und Grüße an (ohne Anspruch auf Vollständigkeit):
\begin{itemize}
\item meinen stets unermüdlichen $\beta$-Tester Michi, weil er mit \Dup\ 
   nichts anfangen kann und das auch offen sagt,
\item AMSoft und die A+L~AG für eine so leistungsfähige Umsetzung einer
   sehr guten (und vor allem {\em lesbaren\/}) Sprache sowie für die
   vorbildliche Update-Politik,
\item D. E. Knuth und L. Lamport für \TeX, \METAFONT\ und \LaTeX,
\item Georg Heßmann, Bernd Raichle und Stefan Becker für die
   AMIGA-Implementationen Passauer\TeX\ und \METAFONT,
\item Timm Martin für SID V2.0, dem besten Dir-Utility für den AMIGA,
\item Fridjof und Achim Siebert für KwickBackUp (und natürlich AMOK),
\item COMMODORE Inc. für den AMIGA,
\item Gene Roddenberry für die meiner Meinung nach beste je erdichtete
   Science-Fiction-Story und -Serie, nämlich {\sf Star Trek},
\item und ungezählte andere$\dots$
\end{itemize}

\newpage
\begin{appendix}
{\marginpar{\large\bf Anhang}\bigskip\bigskip}

\section{Dup.log}

{\tt\small\obeylines
\begin{verbatim}
Amiga Modula-2 Make, 4.014d, 08.03.91, © AMSoft
m2make> Dup.mod
 - txt/Dup.mod
 + Dup.dpd
Ungültiges ObjFile für Dup mod>obj

m2:m2c  +0  txt/Dup.mod

Amiga Modula-2 Compiler 68000, 4.096d, 13.03.91, © AMSoft
() m2c> -d-y
() m2c> +0
() m2c> txt/Dup.mod
 - txt/Dup.mod
 !! DEFINE: +SICHER
 - Module:sym/Arts.sym
 - Module:sym/DosD.sym
 - Module:sym/DosL.sym
 + obj/Dup.obj
ooo.o
 Optimierte Bytes: 60
 fertig. CODE: 1004, CONST: 140, SMALLBSS: 4384, DATA: 0

m2:m2l  +0  Dup

Amiga Modula-2 Linker, 4.096d, 08.03.91, © AMSoft
(RAM:) m2l> +rmi-xgRAM:
(RAM:) m2l> +0
(RAM:) m2l> Dup
 - Module:obj/MRArts.obj
 - obj/Dup.obj
 + bin/Dup 1976 Bytes.  2 Hunks.  0 ALVs erzeugt.
CODE:1900 MERGBSS:4556 
Programm ist reentrant. Pure bit gesetzt. MindestStack: 4000

Make erfolgreich durchgeführt.
\end{verbatim}}

\section{andere Produkte$\dots$}

Ein wenig Werbung sei mir gestattet.

\subsection{\MCED}

\MCED\ ist ein Hilfsprogramnm zum Anzeigen von Fehlerdateien im
\MAmiga-Format auf dem CEDPro-Screen (bzw.  dem Workbench-Screen, wenn
CEDPro nur ein Fenster offen hat).  Sie brauchen es, wenn Sie (zum
Beispiel) mit \MAmiga\ programmieren und Syntaxfehler gerne im CEDPro und
nicht irgendwo sehen wollen.  Spätestens unter KICK~2.0 empfiehlt es sich,
Compiler und Linker, am Besten aber gleich M2Make via ARexx zu benutzen.
Und ohne \MCED\ sitzen Sie dann ganz schön auf dem Schlauch, weil CEDPro
leider keine \MAmiga-Fehlerdatei lesen kann!  Und Sie haben sich CEDPro
doch gerade dafür gekauft, daß Sie ihn benutzen können, oder nicht?  Sehen
Sie.

\MCED\ sticht vor allem durch folgende Eigenschaften hervor:

\begin{itemize}

\item \MCED\ öffnet (auch unter KICK~1.3!) ein Fenster auf dem CED-Screen
   oder auf der Workbench, wenn Sie CEDPro dort haben.  Sie brauchen keine
   Angst zu haben, daß Sie sich die Fehlermeldungen in irgendwelchen
   Titelzeilen (oder sonstwo) zusammensuchen müssen.  Es handelt sich bei
   dem Fenster nicht um einen CED-Requester!  Sie können also Fehler 
   verbessern während die Fehlermeldung angezeigt wird!

\item \MCED\ setzt den Cursor dorthin im CEDPro-Fenster, wo der Compiler
   einen Fehler gefunden hat.  Auch dann, wenn Sie den Fehler gleich an Ort
   und Stelle verbessern!  \item Unter KICK~1.3 ist es möglich, daß CEDPro
   seinen Screen schließt, obwohl andere Programme dort Fenster offen haben.
   An dieser Stelle stürzen viele Programme ab.  Nicht so \MCED!  \MCED\ fängt
   diesen Fehler im CEDPro ab und nimmt Ihnen das nicht weiter übel.

\item \MCED\ ist nicht auf \MAmiga\ beschränkt.  \MCED\ kann alle
   Fehlerdateien im CEDPro anzeigen, die im \MAmiga-Format vorliegen, also zum
   Beispiel auch Fehlerdateien, die von Ohm (Vollversion) erzeugt wurden!

\item Wenn Sie mir die Shareware-Gebühr schicken, erhalten Sie zusammen mit
   der neusten Version von \MCED\ auch die komplette Anleitung in verohmter
   Form!  Verfügen Sie über die Voll-Version von Ohm, so können Sie sich bei
   Unklarheiten jederzeit on-line Hilfe holen!  
\end{itemize}

Die Shareware-Gebühr für \MCED\ beträgt zur Zeit\footnote{April 1992}
DM~15.- (Änderung vorbehalten) zahlbar ausschließlich an mich.

Auf der AMOK\#62 ist \MCED~Version~1.1 erschienen, aktuell und nur bei mir
erhältich ist inzwischen \MCED~Version~1.9.

\end{appendix}
\end{document}